package com.aspire.aimini.repository;

import com.aspire.aimini.model.entity.GenerationRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * AI生成记录Repository接口
 *
 * @author wangguiyou
 * @date 2024-01-01
 * @description AI生成记录数据访问层接口
 */
@Mapper
public interface GenerationRecordRepository extends BaseMapper<GenerationRecord> {

        /**
         * 分页查询生成记录
         *
         * @param page           分页对象
         * @param userId         用户ID
         * @param generationType 生成类型
         * @param provider       服务提供商
         * @param model          模型
         * @param status         状态
         * @param startTime      开始时间
         * @param endTime        结束时间
         * @return 分页结果
         */
        IPage<GenerationRecord> selectRecordPage(
                        Page<GenerationRecord> page,
                        @Param("userId") Long userId,
                        @Param("generationType") String generationType,
                        @Param("provider") String provider,
                        @Param("model") String model,
                        @Param("status") Integer status,
                        @Param("startTime") LocalDateTime startTime,
                        @Param("endTime") LocalDateTime endTime);

        /**
         * 根据用户ID统计生成记录数量
         *
         * @param userId 用户ID
         * @return 记录数量
         */
        Long countByUserId(@Param("userId") Long userId);

        /**
         * 统计用户今日生成次数
         *
         * @param userId         用户ID
         * @param generationType 生成类型
         * @return 今日生成次数
         */
        Long countTodayGeneration(@Param("userId") Long userId, @Param("generationType") String generationType);

        /**
         * 统计用户总消耗金额
         *
         * @param userId 用户ID
         * @return 总消耗金额
         */
        BigDecimal sumCostByUserId(@Param("userId") Long userId);

        /**
         * 统计用户今日消耗金额
         *
         * @param userId 用户ID
         * @return 今日消耗金额
         */
        BigDecimal sumTodayCostByUserId(@Param("userId") Long userId);

        /**
         * 统计用户总消耗Token数
         *
         * @param userId 用户ID
         * @return 总消耗Token数
         */
        Long sumTokensByUserId(@Param("userId") Long userId);

        /**
         * 根据生成类型统计记录数量
         *
         * @param userId 用户ID
         * @return 统计结果
         */
        List<Map<String, Object>> countByGenerationType(@Param("userId") Long userId);

        /**
         * 根据服务提供商统计记录数量
         *
         * @param userId 用户ID
         * @return 统计结果
         */
        List<Map<String, Object>> countByProvider(@Param("userId") Long userId);

        /**
         * 根据模型统计记录数量
         *
         * @param userId 用户ID
         * @return 统计结果
         */
        List<Map<String, Object>> countByModel(@Param("userId") Long userId);

        /**
         * 统计用户每日生成数量
         *
         * @param userId 用户ID
         * @param days   天数
         * @return 统计结果
         */
        List<Map<String, Object>> countDailyGeneration(@Param("userId") Long userId, @Param("days") Integer days);

        /**
         * 统计用户每日消耗金额
         *
         * @param userId 用户ID
         * @param days   天数
         * @return 统计结果
         */
        List<Map<String, Object>> sumDailyCost(@Param("userId") Long userId, @Param("days") Integer days);

        /**
         * 查询失败的生成记录
         *
         * @param userId 用户ID
         * @param limit  限制数量
         * @return 失败记录列表
         */
        List<GenerationRecord> selectFailedRecords(@Param("userId") Long userId, @Param("limit") Integer limit);

        /**
         * 查询最近的生成记录
         *
         * @param userId 用户ID
         * @param limit  限制数量
         * @return 最近记录列表
         */
        List<GenerationRecord> selectRecentRecords(@Param("userId") Long userId, @Param("limit") Integer limit);

        /**
         * 根据素材ID查询相关生成记录
         *
         * @param materialId 素材ID
         * @return 生成记录列表
         */
        List<GenerationRecord> selectByMaterialId(@Param("materialId") Long materialId);

        /**
         * 根据文案ID查询相关生成记录
         *
         * @param copywritingId 文案ID
         * @return 生成记录列表
         */
        List<GenerationRecord> selectByCopywritingId(@Param("copywritingId") Long copywritingId);

        /**
         * 统计平均生成耗时
         *
         * @param generationType 生成类型
         * @param provider       服务提供商
         * @param model          模型
         * @return 平均耗时(毫秒)
         */
        Long avgDurationByTypeAndModel(
                        @Param("generationType") String generationType,
                        @Param("provider") String provider,
                        @Param("model") String model);

        /**
         * 统计成功率
         *
         * @param generationType 生成类型
         * @param provider       服务提供商
         * @param model          模型
         * @return 成功率(百分比)
         */
        Double calculateSuccessRate(
                        @Param("generationType") String generationType,
                        @Param("provider") String provider,
                        @Param("model") String model);

        /**
         * 清理过期的生成记录
         *
         * @param expiredTime 过期时间
         * @return 清理数量
         */
        int cleanExpiredRecords(@Param("expiredTime") LocalDateTime expiredTime);

        /**
         * 删除用户的所有生成记录
         *
         * @param userId 用户ID
         * @return 删除数量
         */
        int deleteByUserId(@Param("userId") Long userId);
}